home *** CD-ROM | disk | FTP | other *** search
/ SPACE 1 / SPACE - Library 1 - Volume 1.iso / utilitys / 9 / sounddem.pas < prev    next >
Pascal/Delphi Source File  |  1986-04-18  |  2KB  |  103 lines

  1. { sound_demo - A simple Personal Pascal sound demo program.
  2.  
  3.     You must turn off key-clicks using the control panel before running this
  4.     program, as the key-click routine in the OS will mess up your sound!  We
  5.     hope soon to add to this demo an XBIOS call to turn off the keyclicks. }
  6.  
  7. PROGRAM sound_demo ;
  8.  
  9.   CONST
  10.     cmd_write = 128 ;
  11.     cmd_read  = 0 ;
  12.     chana_lo = 0 ;
  13.     chana_hi = 1 ;
  14.     chana_vol = 8 ;
  15.     chan_enable = 7 ;
  16.     enable_sound = 7 ;
  17.  
  18.   TYPE
  19.     channel = 0..2 ;
  20.  
  21.   VAR
  22.     volume, note : integer ;
  23.  
  24.  
  25.  
  26. { Two XBIOS functions (actually one call with two definitions!) needed to
  27.   access the General Instruments sound chip. }
  28.  
  29.   FUNCTION gia_read( data, register : integer ) : integer ;
  30.     XBIOS( 28 ) ;
  31.  
  32.   PROCEDURE gia_write( data, register : integer ) ;
  33.     XBIOS( 28 ) ;
  34.  
  35.  
  36.  
  37. { Call this routine to enable sound to be generated. }
  38.  
  39.   PROCEDURE Sound_Init ;
  40.  
  41.     VAR
  42.       port_state : integer ;
  43.  
  44.     BEGIN
  45.       port_state := gia_read( 0, chan_enable+cmd_read ) ;
  46.       gia_write( port_state&(~enable_sound), chan_enable+cmd_write ) ;
  47.     END ;
  48.  
  49.  
  50.  
  51. { This routine turns on a particular note on one of the three channels. }
  52.  
  53.   PROCEDURE Sound( ch : channel ; pitch : integer ; vol : integer ) ;
  54.  
  55.     BEGIN
  56.       gia_write( vol, chana_vol+ch+cmd_write ) ;
  57.       gia_write( pitch&$FF, chana_lo+ch*2+cmd_write ) ;
  58.       gia_write( shr(pitch,8), chana_hi+ch*2+cmd_write ) ;
  59.     END ;
  60.  
  61.  
  62.  
  63. { Call this routine to turn off sound after you're finished. }
  64.  
  65.   PROCEDURE Sound_Off ;
  66.  
  67.     VAR
  68.       port_state : integer ;
  69.  
  70.     BEGIN
  71.       Sound( 0, 0, 0 ) ;        { First, make sure all volumes are zero. }
  72.       Sound( 1, 0, 0 ) ;
  73.       Sound( 2, 0, 0 ) ;
  74.       { Now disable sound production on all three channels. }
  75.       port_state := gia_read( 0, chan_enable+cmd_read ) ;
  76.       gia_write( port_state|enable_sound, chan_enable+cmd_write ) ;
  77.     END ;
  78.  
  79.  
  80.   BEGIN
  81.     { Main program loop-- ask user for a volume to use... should be 0-15. }
  82.     LOOP
  83.       write( 'volume: ' ) ;
  84.       readln( volume ) ;
  85.  
  86.       EXIT IF volume = 0 ;
  87.  
  88.       sound_init ;      { Enable sound. }
  89.  
  90.       { Sub-loop-- keep generating notes until user enters 0 as a pitch. }
  91.       LOOP
  92.           write( 'note: ' ) ;
  93.           readln( note ) ;
  94.           EXIT IF note = 0 ;
  95.           sound( 0, note, volume ) ;
  96.       END ;
  97.  
  98.       sound_off ;       { Disable the sound. }
  99.     END ;
  100.   END.
  101.  
  102.  
  103.